/**
 * @author Angel Marcos Sosa León.
 */
package uoc.ei.practica;


import uoc.ei.tads.Iterador;
import uoc.ei.tads.IteradorVectorImpl;
import uoc.ei.tads.PilaVectorImpl;

/**
 * Entidad que gestiona una Partida
 */

public class Game {
	
	/**
	 * Identificador Partida
	 */
	private String IdGame;
	/**
	 * Identificador Jugador 1
	 */
	private String player1Id;
	/**
	 * Identificador Jugador 2
	 */
	private String player2Id;
	/**
	 * Vector Fichas asignadas al Jugador 1 en la partida
	 */ 
	private Card[] fichasJ1;
	/**
	 * Vector Fichas asignadas al Jugador 2 en la partida
	 */ 
	private Card[]fichasJ2;
	/**
	 * Vector Fichas asignadas al Jugador 1 en la partida. 
	 * Modificada para satisfacer el formato fichero de hopedOut.txt 
	 */ 
	private Card[] fichasModJ1; 
	/**
	 * Vector Fichas asignadas al Jugador 2 en la partida. 
	 * Modificada para satisfacer el formato fichero de hopedOut.txt 
	 */ 
	private Card[]fichasModJ2;
	/**
	 * Contador de numero de fichas en la pila
	 */
	private int numFichas;
	/**
	 * pila donde se alamacenan las fichas de la Partida
	 */
	private PilaVectorImpl<Card> pilaFichas;
	/**
	 * Indicador de partida comenzada
	 */
	private boolean isStart;
	
	/**
	 * Constructor de la clase Game. Inicializa las estructuras de datos
	 */
	
	public Game(String championShipId, String IdGame, String player1,
			String player2) {
		this.IdGame=IdGame;
		this.setPlayer1(player1);
		this.setPlayer2(player2);
		this.fichasJ1=new Card[ScrabbleManager.MAX_CARDS_USER];
		this.fichasJ2=new Card[ScrabbleManager.MAX_CARDS_USER];
		this.fichasModJ1=new Card[ScrabbleManager.MAX_CARDS_USER];
		this.fichasModJ2=new Card[ScrabbleManager.MAX_CARDS_USER];
		this.pilaFichas = new PilaVectorImpl<Card>(ScrabbleManager.MAX_CARDS_GAME);	
		this.isStart=false;
	}
	
	/**
	 * método que proporciona una representación en un String de una partida
	 */
	public String toString(){
		return "id: "+IdGame+"\n";
	}

	public String getGameId() {
		return IdGame;
	}

	/**
	 * método que añade un Ficha a la pila de fichas de la partida. Se valida que no se pueda superar la limitación máxima
	 * @param ficha a añadir
	 * @throws EIException Se lanza una excepción en caso que se supera la limitación
	 */
	public void addCard(Card ficha) throws EIException
	{
			if (this.numFichas>=ScrabbleManager.MAX_CARDS_GAME) 
			{
				throw new EIException(Messages.MAX_CARDS);
			}
			else this.pilaFichas.apilar(ficha);
		}
	
	/**
	 * método que proporciona un iterador de Fichas
	 */
	
	public Iterador<Card> fichas() throws EIException
	{
		if (pilaFichas.estaVacio()) throw new EIException(Messages.NO_CARDS);
		return pilaFichas.elementos();
	}
	/**
	 * método devuelve el numero de veces que aparece una letra en las fichas de la partida
	 * @param letra a comparar
	 * @return el numero de coincidencias
	 */
	public  int numfichasLetra(String letra) 
	{
		int match=0;
		Iterador<Card> it = pilaFichas.elementos();
		while(it.haySiguiente()==true)
		{
			if(it.siguiente().getLetter().equals(letra))
			{
				match++;
			}
		}
		return match;
	}

	/**
	 * Metodo que reparte las fichas entre los 2 jugadores desde la Pila de fichas de la partida y marca como comenzada la partida
	 */
	
	public void startGame() throws EIException
	{	
		Card ficha=null;
		
		
		for(int i = 0; i<ScrabbleManager.MAX_CARDS_USER; i++)
		{
			//Player 1
			ficha=pilaFichas.desapilar();
			addCarToPlayer(ficha,1,i);
			String fichamod = getPlayer1()+" "+ficha.getLetter();
			Card fMod = new Card(null, null, fichamod);
			addCarToPlayerMod(fMod,1,i);
			
			//Player 2
			ficha=pilaFichas.desapilar();
			addCarToPlayer(ficha,2,i);
			fichamod = getPlayer2()+" "+ficha.getLetter();
			fMod = new Card(null, null, fichamod);
			addCarToPlayerMod(fMod,2,i);
		}
		
		this.isStart=true;
		
		}
	
	/**
	 * método que añade fichas al vector de fichas de un jugador
	 * @param ficha ficha a añadir,int player 1=Jugador 1 2=Jugador 2, posicion del vector en la que se añade la ficha
	 * @return Iterador con las fichas
	 */
	public void addCarToPlayer(Card ficha,int player,int posicion)
	{
			
		if(player==1) this.fichasJ1[posicion]=ficha;
		if(player==2) this.fichasJ2[posicion]=ficha;
	}
	
	/**
	 * método que añade fichas modificadas para cumplir los requisitos de salida del fichero hopedOut.txt 
	 * al vector de fichas de un jugador
	 * @param ficha ficha a añadir,int player 1=Jugador 1 2=Jugador 2, posicion del vector en la que se añade la ficha
	 * @return Iterador con las fichas
	 */
	
	public void addCarToPlayerMod(Card ficha,int player,int posicion)
	{
			
		if(player==1) this.fichasModJ1[posicion]=ficha;
		if(player==2) this.fichasModJ2[posicion]=ficha;
	}
	/**
	 * método que proporciona un iterador de Fichas asignadas a un jugador
	 * @param Jugador 1 o Jugador 2
	 * @return Iterador con las fichas
	 */
	public Iterador<Card> fichasJugador(int j1oj2)
	{
		if(j1oj2==1) return new IteradorVectorImpl<Card>(this.fichasJ1,ScrabbleManager.MAX_CARDS_USER,0);
		else return new IteradorVectorImpl<Card>(this.fichasJ2,ScrabbleManager.MAX_CARDS_USER,0);
	}
	
	/**
	 * método que proporciona un iterador de Fichas Modificadas para satisfacer el fichero de salida hopedOut.txt
	 *  asignadas a un Jugador
	 * @param Jugador 1 o Jugador 2
	 * @return Iterador con las fichas
	 */
	
	public Iterador<Card> fichasJugadorMod(int j1oj2) throws EIException
	{
		if(j1oj2==1) return new IteradorVectorImpl<Card>(this.fichasModJ1,ScrabbleManager.MAX_CARDS_USER,0);
		else return new IteradorVectorImpl<Card>(this.fichasModJ2,ScrabbleManager.MAX_CARDS_USER,0);
	}
	public String getPlayer1() {
		return player1Id;
	}

	public void setPlayer1(String player1) {
		this.player1Id = player1;
	}

	public String getPlayer2() {
		return player2Id;
	}

	public void setPlayer2(String player2) {
		this.player2Id = player2;
	}

	public boolean isStart() {
		return isStart;
	}
	
	/**
	 * método que busca a un jugador y lo identifica como Jugador 1 o Jugador 2.
	 *  asignadas a un Jugador
	 * @param player Identificador del Jugador
	 * @return 0 si no se encuentra el jugador,1 si es Jugador 1 y 2 si es Jugador 2
	 */
	
	public int p1Orp2(String player)
	{
		if(player.equals(this.player1Id))return 1;
		if(player.equals(this.player2Id))return 2;
		return 0;
	}
}
